﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Resources;

namespace IronBox.Core.Utilities
{
    /// <summary>
    /// 资源加载工具，负责加载主题资源、控件样式等
    /// 封装资源路径处理、缓存等逻辑
    /// </summary>
    public static class IronBoxResourceLoader
    {
        // 主题资源所在的程序集名称（需与IronBox.Themes项目的AssemblyName一致）
        private const string ThemeAssemblyName = "IronBox.Themes";

        /// <summary>
        /// 加载指定主题的资源字典
        /// </summary>
        /// <param name="themeName">主题名称（如"ClassicIron"）</param>
        public static void LoadThemeResources(string themeName)
        {
            if (string.IsNullOrEmpty(themeName))
                throw new ArgumentNullException(nameof(themeName));

            try
            {
                // 主题资源路径（对应IronBox.Themes项目中的Presets目录）
                string resourcePath = $"Presets/{themeName}.xaml";

                // 从主题程序集中加载资源字典
                var resourceDict = LoadResourceDictionary(ThemeAssemblyName, resourcePath);

                // 合并到应用全局资源（确保所有控件能使用主题资源）
                MergeResourceDictionary(resourceDict);
            }
            catch (Exception ex)
            {
                //throw new InvalidOperationException(
                //    $"加载主题资源失败：{themeName}。请检查主题是否存在。", ex);

                //暂时先返回null
                return;
            }
        }

        /// <summary>
        /// 从指定程序集中加载资源字典
        /// </summary>
        internal static ResourceDictionary LoadResourceDictionary(string assemblyName, string resourcePath)
        {
            // WPF资源路径格式：/程序集名称;component/资源路径
            var uri = new Uri($"/{assemblyName};component/{resourcePath}", UriKind.Relative);

            // 加载资源流
            StreamResourceInfo resourceInfo = Application.GetResourceStream(uri);
            if (resourceInfo == null)
                throw new KeyNotFoundException($"未找到资源：{resourcePath}（程序集：{assemblyName}）");

            // 解析XAML资源字典
            using (var stream = resourceInfo.Stream)
            {
                return (ResourceDictionary)System.Windows.Markup.XamlReader.Load(stream);
            }
        }

        /// <summary>
        /// 将资源字典合并到应用全局资源（去重处理）
        /// </summary>
        private static void MergeResourceDictionary(ResourceDictionary newDict)
        {
            var appResources = Application.Current.Resources;

            // 检查是否已加载，避免重复合并
            foreach (var dict in appResources.MergedDictionaries)
            {
                if (dict.Source == newDict.Source)
                    return; // 已存在，直接返回
            }

            // 合并新资源
            appResources.MergedDictionaries.Add(newDict);
        }
    }
}
